from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from django.views import View


class ImageCodeView(View):

    def get(self,request,uuid):

        '''
        1.接受请求
        2.提取参数
        3.验证参数
        4.生成图片没验证码图片和获取图片验证码的内容
        5.保存图片验证码
        6.返回图片响应
        :param request:
        :param uuid:
        :return:
        '''
        # 1.接受请求
        # 2.提取参数
        # 3.验证参数
        # uuid  形式  ××××-××××-××××-××××
        # if not re.match()
        # 为了加深理解自定义转换器  所以这里还用自定义转换器

        # 4.生成图片没验证码图片和获取图片验证码的内容
        from libs.captcha.captcha import captcha
        # captcha.generate_captcha()
        # 返回 第一个数据是 图片验证码的内容
        # 返回 第二个数据是 图片验证码的图片二进制
        text,image=captcha.generate_captcha()
        # 5.保存图片验证码(redis)
        # 5.1先链接redis
        from django_redis import get_redis_connection
        # get_redis_connection(配置中CACHES的名字)
        # 获取 redis 链接
        redis_cli=get_redis_connection('code')
        # 5.2设置数据
        # setex key seconds value
        redis_cli.setex(uuid,300,text)

        # 6.返回图片响应
        # 注意事项！！！我们返回的不是JSON  而是图片二进制
        # content_type='image/jpeg'
        # 告知浏览器  返回的是二进制图片 需使用图片的方式打开
        return HttpResponse(image,content_type='image/jpeg')



# 短信验证码类视图############################
from django.http import JsonResponse,HttpResponseBadRequest
class SmsCodeView(View):

    def get(self,request,mobile):

        '''
        1.接收参数
        2.获取参数
        3.验证参数
        4.提取redis中的图片验证码
        5.把redis中的图片验证码删除
        6.用户的图片验证码和redis进行比对
            (redis的数据是bytes类型  内容大小写统一)
        7.通过程序生成短信验证码
        8.将短信验证码保存到redis中
        9.通过 容联云 发送短信
        10.返回响应
        :param request:
        :param mobile:
        :return:
        '''
        # 1.接收参数 (手机号，用户的图片验证码，uuid)
        # 2.获取参数
        # /sms_code/<mobile>/?image_code=xxx&image_code_id=xxx

        # request.GET     1 查询字符串      选1
        # request.POST    2 (form表单数据)
        # request.body    3 (JSON)
        # request.META    4 (请求头)
        # 用户的图片验证码
        image_code=request.GET.get('image_code')
        uuid=request.GET.get('image_code_id')

        # 3.验证参数
        # 3.1 这两个变量 都要有数据
        # 3.2 image_code 的长度
        # 3.3 uuid 验证

        # 4.提取redis中的图片验证码
        from django_redis import get_redis_connection
        redis_cli=get_redis_connection('code')
        redis_text=redis_cli.get(uuid)

        # 5.把redis中的图片验证码删除
        redis_cli.delete(uuid)

        # 6.用户的图片验证码和redis进行比对
        #     (redis的数据是bytes类型  内容大小写统一)

        # 用户输入的 和 redis中的不相等，告知输入错误
        # redis_text.decode()  将bytes类型转换为str类型
        # 内容大小写要统一 lower() 或 upper()

        if image_code.lower() != redis_text.decode().lower():
            return JsonResponse({'code':400,'errmsg':'图片验证码错误'})


        # 在生成短信验证码前  判断标记
        send_flag = redis_cli.get('send_flag_%s'%mobile)

        # send_flag 只要有值 就说明 在频繁操作
        if send_flag is not None:
            return HttpResponseBadRequest('不要频繁操作')
            # return JsonResponse({'code':400,'errmsg':'不要频繁操作'})


        # 7.通过程序生成短信验证码
        from random import randint

        sms_code=randint(100000,999999)

        # # 8.将短信验证码保存到redis中
        # # setex key seconds value
        # # 10分钟过期  600s
        # redis_cli.setex(mobile,600,sms_code)
        #
        # # 添加一个标记
        # # 标记就是 ‘1’
        # redis_cli.setex('send_flag_%s'%mobile,120,1)


        # 8.将短信验证码保存到redis中  (pipeline操作)
        # 8.1 创建管道
        # 通过 redis 的客户端 创建一个 管道 pipeline()
        pipeline=redis_cli.pipeline()
        # 8.2 管道 添加指令
        pipeline.setex(mobile, 600, sms_code)
        pipeline.setex('send_flag_%s' % mobile, 120, 1)
        # 8.3 执行管道  不执行-->指令丢失
        pipeline.execute()



        # # 9.通过 容联云 发送短信
        # from ronglian_sms_sdk import SmsSDK
        # accId = '8a216da8762cb4570176dc6980c73faf'
        # accToken = '00d313c3df214478b14d9b99b8676dc9'
        # appId = '8a216da8762cb4570176dc6981b03fb6'
        #
        # # 9.1 创建容联云 实例对象
        # sdk = SmsSDK(accId, accToken, appId)
        #
        # tid = '1'  # 发送短信的模板，值 只能是 1
        # mobile = '%s'%mobile  # '手机号1，手机号2' 给哪些手机号发送短信，只能是测试手机号
        # datas = (sms_code, 5)  # ('变量1', '变量2')  涉及模板的变量
        # # 您的验证码为{}，请于{}分钟内输入
        # # 9.2 发送短信
        # # resp = sdk.sendMessage(tid, mobile, datas)
        # # print(resp)
        #
        # sdk.sendMessage(tid, mobile, datas)

        from celery_tasks.sms.tasks import celery_send_sms_code
        # 注意： 任务(函数)必须要调用 delay 方法
        # delay的参数  同任务(函数)的参数
        celery_send_sms_code.delay(mobile,sms_code)



        # 10.返回响应
        return JsonResponse({'code':0,'errmsg':'ok'})








